/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufsc.aps.jogodavida.control;

import br.ufsc.aps.jogodavida.model.Carta;
import br.ufsc.aps.jogodavida.model.Lance;
import br.ufsc.aps.jogodavida.model.Tabuleiro;
import br.ufsc.aps.jogodavida.model.TipoLance;
import br.ufsc.aps.jogodavida.view.PanelConnect;
import br.ufsc.aps.jogodavida.view.PanelTabuleiro;
import br.ufsc.inf.leobr.cliente.Jogada;
import br.ufsc.inf.leobr.cliente.exception.ArquivoMultiplayerException;
import br.ufsc.inf.leobr.cliente.exception.JahConectadoException;
import br.ufsc.inf.leobr.cliente.exception.NaoConectadoException;
import br.ufsc.inf.leobr.cliente.exception.NaoPossivelConectarException;
import javax.swing.JOptionPane;

/**
 *
 * @author Daniel
 */
public class AtorJogador {
    
    protected String nomeUsuario;
    protected AtorNetGames rede;
    private boolean isConectado = false;
    private boolean jogoTerminado = false;
    private Tabuleiro meuTabuleiro;
    private PanelConnect connectPanel;
    private PanelTabuleiro tabuleiroPanel;
    
    public AtorJogador() {
        super();
        rede = new AtorNetGames(this);
        meuTabuleiro = new Tabuleiro();
    }
  
    public String getNomeUsuario() {
        return nomeUsuario;
}

    public void setNomeUsuario(String nomeUsuario) {
        this.nomeUsuario = nomeUsuario;
    }

    public boolean isConectado() {
        return isConectado;
    }

    public void setIsConectado(boolean isConectado) {
        this.isConectado = isConectado;
    }

    public boolean isJogoTerminado() {
        return jogoTerminado;
    }

    public void setJogoTerminado(boolean jogoTerminado) {
        this.jogoTerminado = jogoTerminado;
    }

    public Tabuleiro getMeuTabuleiro() {
        return meuTabuleiro;
    }

    public void setMeuTabuleiro(Tabuleiro meuTabuleiro) {
        this.meuTabuleiro = meuTabuleiro;
    }
    
    public String obterDadosConexao() {
        return "venus.inf.ufsc.br";
    }

    public boolean conectar() throws JahConectadoException, NaoPossivelConectarException, ArquivoMultiplayerException {
        String servidor;
        servidor = obterDadosConexao();
        boolean exito = rede.conectar(servidor, nomeUsuario);
        if (exito) {
            setIsConectado(exito);
        }
        return exito;
    }

    public void finalizarPartida() {
        rede.desconectar();
        meuTabuleiro.reset();
    }

    public void desconectar() {
        if (isConectado()) {
            rede.desconectar();
            setIsConectado(false);
        }
    }

    public void iniciarPartida() throws NaoConectadoException {
        if (isConectado()) {
            rede.iniciarPartida();
            setJogoTerminado(false);                        
        } else {
            throw new NaoConectadoException();
        }
    }
    
    public void setConnectPanel(PanelConnect cp) {
        this.connectPanel = cp;
    }

    public void receberJogada(Jogada jogada) {
        TipoLance tl = meuTabuleiro.receberJogada(jogada);
        if (tl == TipoLance.JOGADA_INICIO) {
            this.enviarJogadaDeInicio(true);
        } else if (tl == TipoLance.ENCHENTE) {
            tabuleiroPanel.avisoEnchente();
        } else if (tl == TipoLance.FIM_DE_JOGO) {
            tabuleiroPanel.mostrarResultadoFinal(((Lance) jogada).isOponenteVencedor());            
        }
        tabuleiroPanel.montar();
    }
    
    public void enviarJogada(Lance lance) {
        meuTabuleiro.getJ1().setDaVez(false);
        meuTabuleiro.getJ2().setDaVez(true);
        tabuleiroPanel.montar();
        if(meuTabuleiro.isRealizouEnchente()) {
            meuTabuleiro.setRealizouEnchente(false);
        }
        rede.enviarJogada(lance);
    }

    public void tratarInicioPartida(Integer ordem) {
        connectPanel.waitFinished();
        String nomeOponente = rede.informarNomeAdversario(nomeUsuario);
        meuTabuleiro.criarJogadores(nomeUsuario, nomeOponente);
        meuTabuleiro.resetAndOrder(ordem);
        tabuleiroPanel.montar();
        if (ordem == 1) {
            this.enviarJogadaDeInicio(false);
        }
    }

    public void finalizarPartidaComErro(String message) {
        tabuleiroPanel.connectionLost(message);
        if (!jogoTerminado) {
            tabuleiroPanel.exibirMensagem(message, JOptionPane.ERROR_MESSAGE);
        }
        connectPanel.connectionLost(message);
    }
    
    public void setTabuleiroPanel(PanelTabuleiro pt) {
        this.tabuleiroPanel = pt;
    }

    public void enviarJogadaDeInicio(boolean isSegundo) {
        meuTabuleiro.distribuirValoresIniciais();
        Lance l = new Lance((isSegundo ? TipoLance.FIM_JOGADA_INICIO : TipoLance.JOGADA_INICIO), meuTabuleiro.getBaralho());
        l.setCartasMao(meuTabuleiro.getJ1().getCartasDaMao());
        this.enviarJogada(l);
    }
    
    public void comprarCarta(String bar) {
        String ret = meuTabuleiro.comprarCarta(bar);
        if (ret == null) { 
            tabuleiroPanel.montar();
        } else {
            tabuleiroPanel.exibirMensagem(ret, JOptionPane.ERROR_MESSAGE);
        }
    }
    
    public void adicionarCarta(Carta carta) {
        String ret = meuTabuleiro.adicionarCarta(carta);
        if (ret == null) {
            if(meuTabuleiro.verificarVencedor()) {
                this.enviarFimDeJogo();
            }
            else {
                tabuleiroPanel.montar();
            }
        } else {
            tabuleiroPanel.exibirMensagem(ret, JOptionPane.ERROR_MESSAGE);
        }
    }
    
    public void pagarCartaNegativa(Carta cartaPositiva, Carta cartaNegativa) {
        String ret = meuTabuleiro.pagarCartaNegativa(cartaPositiva, cartaNegativa);
        if (ret == null) { 
            tabuleiroPanel.montar();
        } else {
            tabuleiroPanel.exibirMensagem(ret, JOptionPane.ERROR_MESSAGE);
        }
    }

    public void passarVez() {
        String ret = meuTabuleiro.passarVez();
        if(ret == null) {
            if(meuTabuleiro.verificarVencedor()) {
                this.enviarFimDeJogo();
            }
            else if(!meuTabuleiro.isRealizouEnchente()) {
                Lance l = new Lance(TipoLance.JOGADA_NORMAL, meuTabuleiro.getBaralho());
                l.setCartasMao(meuTabuleiro.getJ1().getCartasDaMao());
                l.setConjuntos(meuTabuleiro.getJ1().getConjuntos());
                this.enviarJogada(l);
            }
            else {
                Lance l = new Lance(TipoLance.ENCHENTE, meuTabuleiro.getBaralho());
                l.setCartasMao(meuTabuleiro.getJ1().getCartasDaMao());
                l.setConjuntos(meuTabuleiro.getJ1().getConjuntos());
                this.enviarJogada(l);
            }
        } else {
            tabuleiroPanel.exibirMensagem(ret, JOptionPane.ERROR_MESSAGE);
        }
    }
    
    public void enviarFimDeJogo() {
        Lance l = new Lance(TipoLance.FIM_DE_JOGO, meuTabuleiro.getBaralho());
        l.setCartasMao(meuTabuleiro.getJ1().getCartasDaMao());
        l.setConjuntos(meuTabuleiro.getJ1().getConjuntos());
        l.setOponenteVencedor(false);
        this.enviarJogada(l);
        setJogoTerminado(true);
        tabuleiroPanel.mostrarResultadoFinal(true);
    }
    
    
}
